package com.yanghui.lingyue.functions

import com.icedata.sika.bridge.SikaEvent
import com.icedata.sika.core.CommandProcessor
import com.icedata.sika.core.Sika
import com.yanghui.lingyue.data.Command
import java.util.*

/**
 * 一个抽象的功能类
 *
 * @property name String 功能的名字，Bot通过名字来搜索对应的方法来注入解析脚本，同时name作为指令头参与到执行器的筛选中去
 * @property enableGroup LinkedList<Long> 可行组，这个只有这个组中的群组才会被执行这个功能，在filter中使用
 * @property reply Reply 解析脚本组，自动解析当前的Event并且根据脚本返回一个指令码，指令码需要在parse里面包装成command来发送出去
 * @constructor
 */
abstract class AbstractFunction{
    val enableGroup: LinkedList<Long> = LinkedList()
    abstract val name: String
    abstract suspend fun parse(event: SikaEvent, sika: Sika): LinkedList<Command>
    abstract suspend fun execute(command: Command, sika: Sika): CommandProcessor.Result
    abstract fun filter(command: Command): Boolean
}